package com.example.demo.utils;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.ClickHouse.ClickHouseMapper;
import com.example.demo.mapper.OrderMapper;
import com.example.demo.mapper.PutOrderMapper;
import com.example.demo.pojo.Order.Orders;
import com.example.demo.pojo.Order.PutOrders;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Component
@Slf4j
public class StockUtils {
    @Resource
    private OrderMapper orderMapper;
    @Resource
    private PutOrderMapper putOrderMapper;

    @Resource
    private ClickHouseMapper clickHouseMapper;

//    //判断股票是哪个板块的,如北交所or深交or沪交or创业板or新三板
//    public String JudgeSector(String stockCode) {
//        // 创业板
//        String regex_chuanYeBan = "^300\\d{3}$";
//        Pattern pattern_chuanYeBan = Pattern.compile(regex_chuanYeBan);
//        // 科创板
//        String regex_keChuanBan = "^688\\d{3}$";
//        Pattern pattern_keChuanBan = Pattern.compile(regex_keChuanBan);
//        // 北交所
//        String regex_beiJiaoSuo1 = "^8\\d{5}$";
//        Pattern pattern_beiJiaoSuo1 = Pattern.compile(regex_beiJiaoSuo1);
//        String regex_beiJiaoSuo2 = "^43\\d{4}$";
//        Pattern pattern_beiJiaoSuo2 = Pattern.compile(regex_beiJiaoSuo2);
//        // 沪市主板
//        String regex_shangHaiZhuBan = "^60\\d{4}$";
//        Pattern pattern_shangHaiZhuBan = Pattern.compile(regex_shangHaiZhuBan);
//        // 深市主板
//        String regex_shenZhenZhuBan = "^00\\d{4}$";
//        Pattern pattern_shenZhenZhuBan = Pattern.compile(regex_shenZhenZhuBan);
//
//        // 匹配
//        Matcher matcher = null;
//        if (pattern_chuanYeBan.matcher(stockCode).matches()) {
//            return "创业板";
//        }
//        if (pattern_keChuanBan.matcher(stockCode).matches()) {
//            return "科创板";
//        }
//        if (pattern_beiJiaoSuo1.matcher(stockCode).matches()
//                || pattern_beiJiaoSuo2.matcher(stockCode).matches()
//        ) {
//            return "北交所";
//        }
//        if (pattern_shangHaiZhuBan.matcher(stockCode).matches()) {
//            return "沪市主板";
//        }
//        if (pattern_shenZhenZhuBan.matcher(stockCode).matches()) {
//            return "深市主板";
//        }
//        return null;
//    }
//
//    //判断股票状态,停牌or刚上市or退市orSt股or正常,分别用 0,1,2,3,4来代表
//    public Integer StockStatus(String stockCode, String date) {
//        //是否停牌?
//        Boolean flag = null;
//        flag = IsStopTrading(stockCode, date);
//        if (flag) {
//            return 0;
//        }
//        //是否为刚上市?是交易日,但是倒查查不到以往的交易数据,说明为刚上市
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        LocalDateTime localDateTime = LocalDateTime.now();
//        String sector = JudgeSector(stockCode);
//        if ("创业板".equals(sector) || "科创板".equals(sector)) {
//            //其中创业板,科创板倒查四天,跳过不是交易日的天数,如果查到在五天内有一天是没数据的,说明刚上市
//            int count = 5;
//            while (true) {
//                Stock stock = clickHouseMapper.getStockInfo(stockCode, localDateTime);
//                if (stock.getLast() == null) {
//                    return 1;
//                }
//                //如果是交易日则日期减1继续判断
//                if (IsTradingDay(localDateTime)) {
//                    localDateTime.minusDays(1);
//                    count--;
//                }
//                //如果不是交易日则跳过这天
//                else {
//                    continue;
//                }
//                if (count == 0) {
//                    break;
//                }
//            }
//        }
//        // 判断其他板块
//        else {
//            //获取上一个交易日的日期
//            while (true) {
//                //如果发现不是交易日,则继续减1
//                if (!IsTradingDay(date)) {
//                    localDateTime.minusDays(1);
//                    continue;
//                }
//                break;
//            }
//            //获取上一个交易日的收盘价
//            Stock stock = clickHouseMapper.getStockInfo(stockCode, localDateTime);
//            if (stock.getLast() == null) {
//                return 1;
//            }
//
//        }
//        //是否退市?结合日期判断
//        while (true) {
//            if (!IsTradingDay(localDateTime)) {
//                localDateTime.minusDays(1);
//                continue;
//            }
//            Stock stock = clickHouseMapper.getStockInfo(stockCode, localDateTime);
//            String regex = "退市..";
//            Pattern pattern = Pattern.compile(regex);
//            if (pattern.matcher(regex).matches()) {
//                return 2;
//            } else {
//                break;
//            }
//        }
//        // 补充,st和*st股
//        Stock stock = clickHouseMapper.getStockInfo(stockCode, localDateTime);
//        String regex_st1 = "^st\\d{2}$";
//        Pattern pattern_st1 = Pattern.compile(regex_st1);
//        String regex_st2 = "^*st\\d{2}$";
//        Pattern pattern_st2 = Pattern.compile(regex_st2);
////        String stockName = stock.getStockName();
////        if (pattern_st1.matcher(stockName).matches() || pattern_st2.matcher(stockName).matches()) {
////            return 3;
////        }
//        // 返回正常
//        return 4;
//    }
//
//
//    //判断是否停牌,为停牌时返回true,否则返回false
//    public Boolean IsStopTrading(String stockCode, String date) {
//        //停牌即当前为交易日但是这只股票股价不是涨停跌停,并且没有波动
//        boolean isTradingDay = IsTradingDay(date);
//        BigDecimal upPrice = GetLimitUpPrice(stockCode, date);
//        BigDecimal downPrice = GetLimitDownPrice(stockCode, date);
//        BigDecimal nowPrice = GetNowMarkPrice(stockCode);
//        boolean isVolatile = stockPriceVolatile(stockCode, date);
//        if (isTradingDay && nowPrice.compareTo(upPrice) < 0 && nowPrice.compareTo(downPrice) > 0 && !isVolatile) {
//            return true;
//        }
//        return false;
//    }
//
//
//    //判断是否为交易日
//    public Boolean IsTradingDay(String date) {
//        //通过三支自上市以来从未停牌的股票的价格在交易日内四个时间段股价是否有波动来确定当天是否为交易日
//        //招商蛇口 001979、中国核电 601985、陕西煤业 601225
//        //这里的time只传入日期 即 2023-11-23
//        int count = 10;
//        String firstStockCode = "001979";
//        String secondStockCode = "601985";
//        String thirdStockCode = "601225";
//        //获得三个flag,要求三个flag都同时为true才能判断当天为交易日
//        boolean firstflag = stockPriceVolatile(firstStockCode, date);
//        boolean secondflag = stockPriceVolatile(secondStockCode, date);
//        boolean thirdflag = stockPriceVolatile(thirdStockCode, date);
//        return firstflag && secondflag && thirdflag;
//    }
//
//    //判断股价是否波动
//    public Boolean stockPriceVolatile(String stockCode, String date) {
//        //判断今天的股价和昨天的相比,是否有变化,如果有则说明今天是交易日,如果没有则说明不是
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        //获取昨天的日期
//        LocalDate oldDate = LocalDate.parse(date, df);
//        oldDate = oldDate.minusDays(1);
//        //初始化
//        StringBuilder stringBuilder = new StringBuilder();
//        StringBuilder stringBuilderOld = new StringBuilder();
//        stringBuilder.append(date);
//        stringBuilderOld.append(oldDate);
//        stringBuilder.append(" ");
//        stringBuilderOld.append(" ");
//        //今天上午和昨天上午开盘的比较
//        stringBuilder.append("09:30:00");
//        stringBuilderOld.append("09:30:00");
//        String MORNINGSTARTTIME = stringBuilder.toString();
//        String OLDMORNINGSTARTTIME = stringBuilderOld.toString();
//        Stock stockMORNINGSTARTTIME = clickHouseMapper.getStockInfo(stockCode, MORNINGSTARTTIME);
//        Stock stockOLDMORNINGSTARTTIME = clickHouseMapper.getStockInfo(stockCode, OLDMORNINGSTARTTIME);
//        //如果发现股价不同,则说明是交易日,但是股价如果相同,有可能是连续两天涨停或跌停,所以单靠一天的某个时间段判断还不够
//        if (!stockMORNINGSTARTTIME.getLast().equals(stockOLDMORNINGSTARTTIME.getLast())) {
//            return true;
//        }
//        stringBuilder.delete(11, 18);
//        stringBuilderOld.delete(11, 18);
//        //今天上午收盘和昨天上午收盘的比较
//        stringBuilder.append("11:30:00");
//        stringBuilderOld.append("11:30:00");
//        String MORNINGENDTIME = stringBuilder.toString();
//        String OLDMORNINGENDTIME = stringBuilderOld.toString();
//        Stock stockMORNINGENDTIME = clickHouseMapper.getStockInfo(stockCode, MORNINGENDTIME);
//        Stock stockOLDMORNINGENDTIME = clickHouseMapper.getStockInfo(stockCode, OLDMORNINGENDTIME);
//        if (!stockMORNINGENDTIME.getLast().equals(stockOLDMORNINGENDTIME.getLast())) {
//            return true;
//        }
//        stringBuilder.delete(11, 18);
//        stringBuilderOld.delete(11, 18);
//        //今天下午和昨天下午开盘的比较
//        stringBuilder.append("13:00:00");
//        stringBuilderOld.append("13:00:00");
//        String NOONSTARTTIME = stringBuilder.toString();
//        String OLDNOONSTARTTIME = stringBuilderOld.toString();
//        Stock stockNOONSTARTTIME = clickHouseMapper.getStockInfo(stockCode, NOONSTARTTIME);
//        Stock stockOLDNOONSTARTTIME = clickHouseMapper.getStockInfo(stockCode, OLDNOONSTARTTIME);
//        if (!stockNOONSTARTTIME.getLast().equals(stockOLDNOONSTARTTIME.getLast())) {
//            return true;
//        }
//        stringBuilder.delete(11, 18);
//        stringBuilderOld.delete(11, 18);
//        //今天下午收盘和昨天下午收盘的比较
//        stringBuilder.append("15:00:00");
//        stringBuilderOld.append("15:00:00");
//        String NOONENDTIME = stringBuilder.toString();
//        String OLDNOONENDTIME = stringBuilder.toString();
//        Stock stockNOONENDTIME = clickHouseMapper.getStockInfo(stockCode, NOONENDTIME);
//        Stock stockOLDNOONENDTIME = clickHouseMapper.getStockInfo(stockCode, OLDNOONENDTIME);
//        return !stockNOONENDTIME.getLast().equals(stockOLDNOONENDTIME.getLast());
//    }
//
//    //计算涨停价
//    public BigDecimal GetLimitUpPrice(String stockCode, String date) {
//        //获取最近一天的收盘价的价格,以这个交易日为基准,计算今天的涨停价
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        LocalDate oldDate = null;
//        StringBuilder stringBuilder = new StringBuilder();
//        //获取上一个交易日的日期
//        while (true) {
//            //如果发现不是交易日,则继续减1
//            if (!IsTradingDay(date)) {
//                oldDate = LocalDate.parse(date, df);
//                oldDate = oldDate.minusDays(1);
//                continue;
//            }
//            stringBuilder.append(oldDate).append(" ").append("15:00:00");
//            break;
//        }
//        //获取上一个交易日的收盘价
//        Stock stock = clickHouseMapper.getStockInfo(stockCode, stringBuilder.toString());
//        //计算涨停价,不同的交易市场要分开计算
//        // 获取交易市场
//        String sector = JudgeSector(stockCode);
//        // 获取当前股票状态
//        Integer status = StockStatus(stockCode, date);
//        // 规则
//        // 股票状态,停牌or刚上市or退市orSt股or正常,分别用 0,1,2,3,4来代表
//        //1 标准股票(指沪深主板)
//        //获取昨天收盘价,加减百分之10即可,但是为昨日收盘价*1.1再四舍五入
//        //2014年1月1日开始至2023年2月17日注册制新规落地后的第一批注册制主板上市前(2023年4月10日) 主板股票上市首日涨幅限制都为44%,跌幅限制都为36%。
//        //st股则变成5%
//        //正常
//        if ("沪市主板".equals(sector) && status.equals(4) || "深市主板".equals(sector) && status.equals(4)) {
//            BigDecimal up = new BigDecimal("1.10");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //st
//        if ("沪市主板".equals(sector) && status.equals(3) || "深市主板".equals(sector) && status.equals(3)) {
//            BigDecimal up = new BigDecimal("1.05");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("沪市主板".equals(sector) && status.equals(1) || "深市主板".equals(sector) && status.equals(1)) {
//            BigDecimal up = new BigDecimal("1.44");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //2 北交所
//        //日常交易日涨跌幅为30% 上市首日不限涨跌幅,但是会在涨幅达到30%,60%的时候触发停牌,停牌十分钟
//        //目前没在北交所看到ST股
//        //正常
//        if ("北交所".equals(sector) && status.equals(4)) {
//            BigDecimal up = new BigDecimal("1.30");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("北交所".equals(sector) && status.equals(1)) {
//            BigDecimal up = new BigDecimal("100.0");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //3 创业板
//        // 上市五个交易日内,不做涨跌幅限制,但是会在涨幅达到30%,60%的时候触发停牌,停牌十分钟
//        //正常交易日,涨跌幅为20% ,ST退市整理期，期间交易机制不作调整，价格涨跌幅限制比例仍为20%
//        //正常和ST
//        if ("创业板".equals(sector) && status.equals(4) || "创业板".equals(sector) && status.equals(3)) {
//            BigDecimal up = new BigDecimal("1.20");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("创业板".equals(sector) && status.equals(1)) {
//            BigDecimal up = new BigDecimal("100.0");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //4 科创板
//        //上市五个交易日内,不做涨跌幅限制
//        //正常交易日,涨跌幅为20% ST退市整理涨跌幅仍为20%
//        //正常和ST
//        if ("创业板".equals(sector) && status.equals(4) || "创业板".equals(sector) && status.equals(3)) {
//            BigDecimal up = new BigDecimal("1.20");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("创业板".equals(sector) && status.equals(1)) {
//            BigDecimal up = new BigDecimal("100.0");
//            return stock.getLast().multiply(up).setScale(2, RoundingMode.HALF_UP);
//        }
//
//        //如果都不是那就返回-1;
//        return BigDecimal.valueOf(-1);
//    }
//
//    //计算跌停价
//    public BigDecimal GetLimitDownPrice(String stockCode, String date) {
//        //获取最近一天的收盘价的价格,以这个交易日为基准,计算今天的涨停价
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        LocalDate oldDate = null;
//        StringBuilder stringBuilder = new StringBuilder();
//        //获取上一个交易日的日期
//        while (true) {
//            //如果发现不是交易日,则继续减1
//            if (!IsTradingDay(date)) {
//                oldDate = LocalDate.parse(date, df);
//                oldDate = oldDate.minusDays(1);
//                continue;
//            }
//            stringBuilder.append(oldDate).append(" ").append("15:00:00");
//            break;
//        }
//        //获取上一个交易日的收盘价
//        Stock stock = clickHouseMapper.getStockInfo(stockCode, stringBuilder.toString());
//        //计算涨停价,不同的交易市场要分开计算
//        // 获取交易市场
//        String sector = JudgeSector(stockCode);
//        // 获取当前股票状态
//        Integer status = StockStatus(stockCode, date);
//        // 规则
//        // 股票状态,停牌or刚上市or退市orSt股or正常,分别用 0,1,2,3,4来代表
//        //1 标准股票(指沪深主板)
//        //获取昨天收盘价,加减百分之10即可,但是为昨日收盘价*1.1再四舍五入
//        //2014年1月1日开始至2023年2月17日注册制新规落地后的第一批注册制主板上市前(2023年4月10日) 主板股票上市首日涨幅限制都为44%,跌幅限制都为36%。
//        //st股则变成5%
//        //正常
//        if ("沪市主板".equals(sector) && status == 4 || "深市主板".equals(sector) && status == 4) {
//            BigDecimal down = new BigDecimal("0.90");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //st
//        if ("沪市主板".equals(sector) && status == 3 || "深市主板".equals(sector) && status == 3) {
//            BigDecimal down = new BigDecimal("0.95");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("沪市主板".equals(sector) && status == 1 || "深市主板".equals(sector) && status == 1) {
//            BigDecimal down = new BigDecimal("0.64");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //2 北交所
//        //日常交易日涨跌幅为30% 上市首日不限涨跌幅,但是会在涨幅达到30%,60%的时候触发停牌,停牌十分钟
//        //目前没在北交所看到ST股
//        //正常
//        if ("北交所".equals(sector) && status == 4) {
//            BigDecimal down = new BigDecimal("0.70");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("北交所".equals(sector) && status == 1) {
//            BigDecimal down = new BigDecimal("0.01");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //3 创业板
//        // 上市五个交易日内,不做涨跌幅限制,但是会在涨幅达到30%,60%的时候触发停牌,停牌十分钟
//        //正常交易日,涨跌幅为20% ,ST退市整理期，期间交易机制不作调整，价格涨跌幅限制比例仍为20%
//        //正常和ST
//        if ("创业板".equals(sector) && status == 4 || "创业板".equals(sector) && status == 3) {
//            BigDecimal down = new BigDecimal("0.80");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("创业板".equals(sector) && status == 1) {
//            BigDecimal down = new BigDecimal("0.01");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //4 科创板
//        //上市五个交易日内,不做涨跌幅限制
//        //正常交易日,涨跌幅为20% ST退市整理涨跌幅仍为20%
//        //正常和ST
//        if ("创业板".equals(sector) && status == 4 || "创业板".equals(sector) && status == 3) {
//            BigDecimal down = new BigDecimal("0.80");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//        //刚上市
//        if ("创业板".equals(sector) && status == 1) {
//            BigDecimal down = new BigDecimal("0.01");
//            return stock.getLast().multiply(down).setScale(2, RoundingMode.HALF_UP);
//        }
//
//        //如果都不是那就返回-1;
//        return BigDecimal.valueOf(-1);
//    }
//
//    //获取现在的股价
//    public BigDecimal GetNowMarkPrice(String stockCode) {
//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//        LocalDateTime localDateTime = LocalDateTime.now();
//        String time = localDateTime;
////        return clickHouseMapper.getStockInfo(stockCode, time).getLast();
//        return null;
//    }
//
    //判断是否可以交易此股票，今天是否购买过此股票
    public boolean canTradeStock(Integer id, Integer userId, String stockCode) {
        // 查询订单信息
        QueryWrapper<Orders> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("order_id", id)  // 确保字段名与数据库中的一致
                .eq("user_id", userId)  // 确保字段名与数据库中的一致
                .eq("stock_code", stockCode)  // 确保字段名与数据库中的一致
                .eq("status", "买入")  // 确保字段名与数据库中的一致
                // 如果time字段包含时间，确保只比较日期部分
                .apply("DATE_FORMAT(time, '%Y-%m-%d') = {0}", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        List<Orders> ordersList = orderMapper.selectList(queryWrapper);
        log.info(ordersList.toString());
        // 查询挂单信息
        QueryWrapper<PutOrders> putOrdersQueryWrapper = new QueryWrapper<>();
        putOrdersQueryWrapper.eq("order_id", id)
                .eq("user_id", userId)
                .eq("stock_code", stockCode)
                .eq("order_type", "买入")
                // 根据今天的日期添加查询条件
                .apply("DATE_FORMAT(time, '%Y-%m-%d') = {0}", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        List<PutOrders> putOrders = putOrderMapper.selectList(putOrdersQueryWrapper);
        // 判断是否可以交易
        return (ordersList.size() > 0 || putOrders.size() > 0);
    }
}
